// st7735.h
#ifndef ST7735_H
#define ST7735_H

#include <stdint.h>

// Select ST7735S or ST7735R
#define USE_ST7735S 1
// #define USE_ST7735R 1

// 屏幕尺寸
#define ST7735_WIDTH 128
#define ST7735_HEIGHT 128

// ==================== ST7735 命令定义 ====================
#define ST7735_NOP 0x00
#define ST7735_SWRESET 0x01
#define ST7735_RDDID 0x04
#define ST7735_RDDST 0x09
#define ST7735_SLPIN 0x10
#define ST7735_SLPOUT 0x11
#define ST7735_PTLON 0x12
#define ST7735_NORON 0x13
#define ST7735_INVOFF 0x20
#define ST7735_INVON 0x21
#define ST7735_DISPOFF 0x28
#define ST7735_DISPON 0x29
#define ST7735_CASET 0x2A
#define ST7735_RASET 0x2B
#define ST7735_RAMWR 0x2C
#define ST7735_RAMRD 0x2E
#define ST7735_PTLAR 0x30
#define ST7735_COLMOD 0x3A
#define ST7735_MADCTL 0x36
#define ST7735_FRMCTR1 0xB1
#define ST7735_FRMCTR2 0xB2
#define ST7735_FRMCTR3 0xB3
#define ST7735_INVCTR 0xB4
#define ST7735_DISSET5 0xB6
#define ST7735_PWCTR1 0xC0
#define ST7735_PWCTR2 0xC1
#define ST7735_PWCTR3 0xC2
#define ST7735_PWCTR4 0xC3
#define ST7735_PWCTR5 0xC4
#define ST7735_VMCTR1 0xC5
#define ST7735_RDID1 0xDA
#define ST7735_RDID2 0xDB
#define ST7735_RDID3 0xDC
#define ST7735_RDID4 0xDD
#define ST7735_GMCTRP1 0xE0
#define ST7735_GMCTRN1 0xE1

// 颜色定义（RGB565）
#define COLOR_BLACK 0x0000
#define COLOR_WHITE 0xFFFF
#define COLOR_GRAY 0xF7BF
#define COLOR_RED 0x07E0
#define COLOR_GREEN 0x001F
#define COLOR_BLUE 0xF800
#define COLOR_YELLOW (COLOR_RED | COLOR_GREEN)
#define COLOR_CYAN (COLOR_GREEN | COLOR_BLUE)
#define COLOR_MAGENTA (COLOR_RED | COLOR_BLUE)

typedef enum
{
    FONT_8x8   = 0,
    FONT_16x16 = 1,
} font_size_t;

void ST7735_Init(void); // 初始化屏幕

void ST7735_SetWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1); // 设置显示区域

void ST7735_FillScreen(uint16_t color); // 填充整个屏幕颜色

uint16_t *ST7735_GetFrameBuffer(void); // 获取当前帧缓冲区

void ST7735_Flush(void); // 刷新屏幕（DMA传输）
void ST7735_Task(void);  // 刷新任务（主循环中调用）

void ST7735_DrawPixel(uint8_t x, uint8_t y, uint16_t color);                          // 画点
void ST7735_DrawLine(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color); // 画线（Bresenham算法）
void ST7735_DrawRect(uint8_t x, uint8_t y, int8_t w, int8_t h, uint16_t color);       // 画矩形框
void ST7735_FillRect(uint8_t x, uint8_t y, int8_t w, int8_t h, uint16_t color);       // 填充矩形
void ST7735_DrawCircle(uint8_t x0, uint8_t y0, int8_t r, uint16_t color);             // 画圆（Bresenham算法）
void ST7735_FillCircle(uint8_t x0, uint8_t y0, int8_t r, uint16_t color);             // 填充圆

// 画字符串
void ST7735_DrawChar8x8(uint8_t x, uint8_t y, char ch, uint16_t color, uint16_t bgColor, uint8_t isBg);
void ST7735_DrawString8x8(uint8_t x, uint8_t y, const char *str, uint16_t color, uint16_t bgColor, uint8_t isBg);
void ST7735_DrawChar16x16(uint8_t x, uint8_t y, char ch, uint16_t color, uint16_t bgColor, uint8_t isBg);
void ST7735_DrawString16x16(uint8_t x, uint8_t y, const char *str, uint16_t color, uint16_t bgColor, uint8_t isBg);

// 帧率统计
void ST7735_FPSCounterTask(void);
void ST7735_DrawFPS(uint8_t x, uint8_t y);

void ST7735_Printf8x8(uint8_t x, uint8_t y, uint16_t color, uint16_t bgColor, uint8_t isBg, const char *format, ...);
void ST7735_Printf16x16(uint8_t x, uint8_t y, uint16_t color, uint16_t bgColor, uint8_t isBg, const char *format, ...);
void ST7735_Printf8x8AutoWrap(uint8_t    *x,
                              uint8_t    *y,
                              uint16_t    color,
                              uint16_t    bgColor,
                              uint8_t     isBg,
                              const char *format,
                              ...);
void ST7735_Printf16x16AutoWrap(uint8_t    *x,
                                uint8_t    *y,
                                uint16_t    color,
                                uint16_t    bgColor,
                                uint8_t     isBg,
                                const char *format,
                                ...);

#define ST7735_Printf(font, x, y, color, bgColor, isBg, format, ...)               \
    do                                                                             \
    {                                                                              \
        if (font == FONT_8x8)                                                      \
            ST7735_Printf8x8(x, y, color, bgColor, isBg, format, ##__VA_ARGS__);   \
        else if (font == FONT_16x16)                                               \
            ST7735_Printf16x16(x, y, color, bgColor, isBg, format, ##__VA_ARGS__); \
    } while (0)

#define ST7735_PrintfAutoWrap(font, x, y, color, bgColor, isBg, format, ...)               \
    do                                                                                     \
    {                                                                                      \
        if (font == FONT_8x8)                                                              \
            ST7735_Printf8x8AutoWrap(x, y, color, bgColor, isBg, format, ##__VA_ARGS__);   \
        else if (font == FONT_16x16)                                                       \
            ST7735_Printf16x16AutoWrap(x, y, color, bgColor, isBg, format, ##__VA_ARGS__); \
    } while (0)

// 双缓冲切换
void ST7735_SwapBuffers(void);

void ST7735_FillScreen_Ikun(void);

#endif